home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMICUS12.ADF / C / vsprite / mysnb.c < prev    next >
C/C++ Source or Header  |  1986-08-05  |  17KB  |  569 lines

  1. /* Leave this structure definition at the top. Look at gels.h. */
  2. struct vInfo {
  3.    short vx,vy;      /* This VSprites velocity. */
  4.    short id;
  5. };
  6. #define VUserStuff struct vInfo
  7.  
  8.  
  9.  
  10. #include <exec/types.h>
  11. #include <exec/exec.h>
  12. #include <graphics/gfxmacros.h>
  13. #include <graphics/gels.h>
  14. #include <graphics/collide.h>
  15. #include <intuition/intuition.h>
  16.  
  17. #define LIBRARY_VERSION 1
  18.  
  19. /*******************************************************************************
  20.  * A sprite and a bob on a screen.
  21.  */
  22.  
  23. #define SBMWIDTH 320   /* My screen BitMap constants. */
  24. #define SBMHEIGHT 200
  25. #define SBMDEPTH 4
  26.  
  27. #define RBMWIDTH 320   /* My screen BitMap constants. */
  28. #define RBMHEIGHT 200
  29. #define RBMDEPTH SBMDEPTH
  30.  
  31. #define VSPRITEWIDTH 1   /* My VSprite constants. */
  32. #define VSPRITEHEIGHT 12
  33. #define VSPRITEDEPTH 2
  34. #define NSPRITES 1
  35.  
  36. #define BOBWIDTH 62   /* My Bob constants. */
  37. #define BOBHEIGHT 31
  38. #define BOBDEPTH 4
  39. #define NBOBS 1
  40.  
  41. struct IntuitionBase *IntuitionBase = NULL;
  42. struct GfxBase *GfxBase = NULL;
  43.  
  44. struct IntuiMessage *MyIntuiMessage = NULL;
  45.  
  46. struct TextAttr TestFont = {   /* Needed for opening screen. */
  47.    (STRPTR)"topaz.font", TOPAZ_EIGHTY, 0, 0
  48. };
  49.  
  50. /* DBL BUF */
  51. struct BitMap *MyBitMapPtrs[2] = {NULL, NULL};
  52. struct BitMap MyBitMaps[2];
  53. WORD ToggleFrame = 0;
  54.  
  55. struct GelsInfo GInfo;      /* For all Gels. */
  56.  
  57. struct VSprite *VSprites[NSPRITES];
  58. WORDBITS VSpriteImage[] = {
  59. /* Plane 0, Plane 1 */
  60.    0xFFFF, 0xFFFF,   /* Line 1, first. */
  61.    0xFFFF, 0xC003,
  62.    0xFFFF, 0xC003,
  63.    0xF00F, 0xCFF3,
  64.    0xF00F, 0xCFF3,
  65.    0xF00F, 0xCC33,
  66.    0xF00F, 0xCC33,
  67.    0xF00F, 0xCFF3,
  68.    0xF00F, 0xCFF3,
  69.    0xFFFF, 0xC003,
  70.    0xFFFF, 0xC003,
  71.    0xFFFF, 0xFFFF,   /* Line 12, last. */
  72. };
  73. USHORT *VSpriteImage_chip = 0;
  74.  
  75. /* These are the colors that will be used for my VSprites. Note I really do mean
  76.  * colors, not color register numbers. High to low, starting at bit 12 and going
  77.  * down to LSB, there are four bits each of red, green and blue. Please read the
  78.  * sprite section of the hardware manual. The gels system will put them into the
  79.  * proper color registers when they are displayed. Reminder: Sprites can only
  80.  * use color registers in sets of 3...
  81.  *   17,18,19 = sprite 0 and 1,
  82.  *   21,22,23 = sprite 2 and 3,
  83.  *   25,26,27 = sprite 4 and 5,
  84.  *   29,30,31 = sprite 6 and 7.
  85.  * Please read the section on how VSprites are assigned in the RKM.
  86.  */
  87. WORD MyVSpriteColors[] = {
  88.    0x0f00,   /* Full red. */
  89.    0x00f0,   /* Full green. */
  90.    0x000f   /* Full blue. */
  91. };
  92.  
  93. struct Bob *Bobs[NBOBS];
  94. short BobImage[] = {
  95.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,   /* Plane 0, line 1. */
  96.    0xC000, 0x0000,   0x0000, 0x000C,
  97.    0xCFFF, 0xFFFF,   0xFFFF, 0xFFCC,
  98.    0xCC00, 0x0000,   0x0000, 0x00CC,
  99.    0xCCFF, 0xFFFF,   0xFFFF, 0xFCCC,
  100.    0xCCC0, 0x0000,   0x0000, 0x0CCC,
  101.    0xCCCF, 0xFFFF,   0xFFFF, 0xCCCC,
  102.    0xCCCC, 0x0000,   0x0000, 0xCCCC,
  103.    0xCCCC, 0xFFFF, 0xFFFC, 0xCCCC,
  104.    0xCCCC, 0xC000,   0x000C, 0xCCCC,
  105.    0xCCCC, 0xCFFF,   0xFFCC, 0xCCCC,
  106.    0xCCCC, 0xCC00,   0x00CC, 0xCCCC,
  107.    0xCCCC, 0xCCFF,   0xFCCC, 0xCCCC,
  108.    0xCCCC, 0xCCC0,   0x0CCC, 0xCCCC,
  109.    0xCCCC, 0xCCCF,   0xCCCC, 0xCCCC,
  110.    0xCCCC, 0xCCCC,   0xCCCC, 0xCCCC,
  111.    0xCCCC, 0xCCCF,   0xCCCC, 0xCCCC,
  112.    0xCCCC, 0xCCC0,   0x0CCC, 0xCCCC,
  113.    0xCCCC, 0xCCFF,   0xFCCC, 0xCCCC,
  114.    0xCCCC, 0xCC00,   0x00CC, 0xCCCC,
  115.    0xCCCC, 0xCFFF,   0xFFCC, 0xCCCC,
  116.    0xCCCC, 0xC000,   0x000C, 0xCCCC,
  117.    0xCCCC, 0xFFFF, 0xFFFC, 0xCCCC,
  118.    0xCCCC, 0x0000,   0x0000, 0xCCCC,
  119.    0xCCCF, 0xFFFF,   0xFFFF, 0xCCCC,
  120.    0xCCC0, 0x0000,   0x0000, 0x0CCC,
  121.    0xCCFF, 0xFFFF,   0xFFFF, 0xFCCC,
  122.    0xCC00, 0x0000,   0x0000, 0x00CC,
  123.    0xCFFF, 0xFFFF,   0xFFFF, 0xFFCC,
  124.    0xC000, 0x0000,   0x0000, 0x000C,
  125.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,   /* Plane 0, line 31. */
  126.  
  127.         0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,   /* Plane 1, line 1. */
  128.         0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  129.         0xF000, 0x0000, 0x0000, 0x003C,
  130.         0xF000, 0x0000, 0x0000, 0x003C,
  131.         0xF0FF, 0xFFFF, 0xFFFF, 0xFC3C,
  132.         0xF0FF, 0xFFFF, 0xFFFF, 0xFC3C,
  133.         0xF0F0, 0x0000, 0x0000, 0x3C3C,
  134.         0xF0F0, 0x0000, 0x0000, 0x3C3C,
  135.         0xF0F0, 0xFFFF, 0xFFFC, 0x3C3C,
  136.         0xF0F0, 0xFFFF, 0xFFFC, 0x3C3C,
  137.         0xF0F0, 0xF000, 0x003C, 0x3C3C,
  138.         0xF0F0, 0xF000, 0x003C, 0x3C3C,
  139.         0xF0F0, 0xF0FF, 0xFC3C, 0x3C3C,
  140.         0xF0F0, 0xF0FF, 0xFC3C, 0x3C3C,
  141.         0xF0F0, 0xF0F0, 0x3C3C, 0x3C3C,
  142.         0xF0F0, 0xF0F0, 0x3C3C, 0x3C3C,
  143.         0xF0F0, 0xF0F0, 0x3C3C, 0x3C3C,
  144.         0xF0F0, 0xF0FF, 0xFC3C, 0x3C3C,
  145.         0xF0F0, 0xF0FF, 0xFC3C, 0x3C3C,
  146.         0xF0F0, 0xF000, 0x003C, 0x3C3C,
  147.         0xF0F0, 0xF000, 0x003C, 0x3C3C,
  148.         0xF0F0, 0xFFFF, 0xFFFC, 0x3C3C,
  149.         0xF0F0, 0xFFFF, 0xFFFC, 0x3C3C,
  150.         0xF0F0, 0x0000, 0x0000, 0x3C3C,
  151.         0xF0F0, 0x0000, 0x0000, 0x3C3C,
  152.         0xF0FF, 0xFFFF, 0xFFFF, 0xFC3C,
  153.         0xF0FF, 0xFFFF, 0xFFFF, 0xFC3C,
  154.         0xF000, 0x0000, 0x0000, 0x003C,
  155.         0xF000, 0x0000, 0x0000, 0x003C,
  156.         0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  157.         0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,   /* Plane 1, line 31. */
  158.  
  159.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC, /* Plane 2, line 1. */
  160.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  161.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  162.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  163.    0xFF00, 0x0000, 0x0000, 0x03FC,
  164.    0xFF00, 0x0000, 0x0000, 0x03FC,
  165.    0xFF00, 0x0000, 0x0000, 0x03FC,
  166.    0xFF00, 0x0000, 0x0000, 0x03FC,
  167.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  168.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  169.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  170.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  171.    0xFF00, 0xFF00, 0x03FC, 0x03FC,
  172.    0xFF00, 0xFF00, 0x03FC, 0x03FC,
  173.    0xFF00, 0xFF00, 0x03FC, 0x03FC,
  174.    0xFF00, 0xFF00, 0x03FC, 0x03FC,
  175.    0xFF00, 0xFF00, 0x03FC, 0x03FC,
  176.    0xFF00, 0xFF00, 0x03FC, 0x03FC,
  177.    0xFF00, 0xFF00, 0x03FC, 0x03FC,
  178.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  179.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  180.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  181.    0xFF00, 0xFFFF, 0xFFFC, 0x03FC,
  182.    0xFF00, 0x0000, 0x0000, 0x03FC,
  183.    0xFF00, 0x0000, 0x0000, 0x03FC,
  184.    0xFF00, 0x0000, 0x0000, 0x03FC,
  185.    0xFF00, 0x0000, 0x0000, 0x03FC,
  186.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  187.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  188.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,
  189.    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC,   /* Plane 2, line 31. */
  190.  
  191.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC, /* Plane 3, line 1. */
  192.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  193.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  194.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  195.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  196.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  197.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  198.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  199.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  200.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  201.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  202.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  203.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  204.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  205.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  206.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  207.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  208.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  209.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  210.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  211.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  212.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  213.    0xFFFF, 0x0000,   0x0003, 0xFFFC,
  214.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  215.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  216.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  217.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  218.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  219.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  220.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC,
  221.    0xFFFF, 0xFFFF,   0xFFFF, 0xFFFC   /* Plane 3, line 31. */
  222. };
  223. USHORT *BobImage_chip = 0;
  224.  
  225. /* These are for my custom screen. */
  226. struct Screen *screen = NULL;
  227. struct NewScreen ns = {
  228.    0, 0,      /* Start position. */
  229.    SBMWIDTH, SBMHEIGHT, SBMDEPTH,   /* Width, height, depth. */
  230.    -1, -1,      /* Default detail pen, block pen. */
  231.    NULL,      /* Viewing mode. */
  232.    CUSTOMSCREEN | CUSTOMBITMAP,      /* Screen type. DBL BUF */
  233.    &TestFont,      /* Font to use. */
  234.    NULL,      /* No default title. */
  235.    NULL,      /* No pointer to additional gadgets. */
  236.    NULL         /* No pointer to CustomBitMap. For now.*/
  237. };
  238.  
  239. /* These are for my window. */
  240. struct Window *window = NULL;
  241. struct NewWindow nw = {
  242.    0, 0,      /* Start position. */
  243.    SBMWIDTH, SBMHEIGHT,   /* Width, height. */
  244.    -1, -1,      /* Detail pen, block pen. */
  245.    CLOSEWINDOW,      /* IDCMP flags. */
  246.    WINDOWCLOSE | BORDERLESS, /* | BACKDROP,      * Flags. */
  247.    NULL,      /* No pointer to FirstGadget. */
  248.    NULL,      /* No pointer to first CheckMark. */
  249.    NULL,      /* No default Title. */
  250.    NULL,      /* No pointer to Screen. */
  251.    NULL,      /* No pointer to BitMap. */
  252.    0, 0,      /* MinWidth, MinHeight (not used). */
  253.    SBMWIDTH, SBMHEIGHT,   /* MaxWidth, MaxHeight (not used). */
  254.    CUSTOMSCREEN      /* Screen type. */
  255. };
  256.  
  257. /*******************************************************************************
  258.  * This will be called if a sprite collision with the border is detected.
  259.  */
  260.  
  261. borderPatrol(s, b)
  262. struct VSprite *s;
  263. int b;
  264. {
  265.    register struct vInfo *info;
  266.  
  267.    info = &s->VUserExt;
  268.    if (b & (TOPHIT | BOTTOMHIT))   /* Top/Bottom hit, change direction. */
  269.       info->vy = -(info->vy);
  270.    if (b & (LEFTHIT | RIGHTHIT))   /* Left/Right hit, change direction. */
  271.       info->vx = -(info->vx);
  272.  
  273. }
  274.  
  275. /*******************************************************************************
  276.  * Fun Starts.
  277.  */
  278.  
  279. main()
  280. {
  281.    SHORT i, j;
  282.  
  283.    if ((IntuitionBase = (struct IntuitionBase *)
  284.          OpenLibrary("intuition.library", LIBRARY_VERSION)) == 0) {
  285. #ifdef DEBUG
  286.       kprintf("Main: Can't open Intuition.\n");
  287. #endif
  288.       MyCleanup();
  289.       Exit(-1);
  290.    }
  291.  
  292.    if ((GfxBase = (struct GfxBase *)
  293.          OpenLibrary("graphics.library", LIBRARY_VERSION)) == 0) {
  294. #ifdef DEBUG
  295.       kprintf("Main: Can't open Graphics.\n");
  296. #endif
  297.       MyCleanup();
  298.       Exit(-1);
  299.    }
  300.  
  301. /*******************************************************************************
  302.  * DBL BUF
  303.  */
  304.    for(j=0; j<2; j++) {
  305.       InitBitMap(&MyBitMaps[j], RBMDEPTH, RBMWIDTH, RBMHEIGHT);
  306.       for(i=0; i<RBMDEPTH; i++) {
  307.       if ((MyBitMaps[j].Planes[i] = (PLANEPTR)AllocMem (sizeof(SHORT) *
  308.             (RBMWIDTH/8) * RBMHEIGHT, MEMF_CHIP)) == 0) {
  309. /*
  310.          if ((MyBitMaps[j].Planes[i] = (PLANEPTR)AllocRaster(RBMWIDTH,
  311.                RBMHEIGHT)) == 0) {
  312. */
  313. #ifdef DEBUG
  314.             kprintf("Main: Can't allocate BitMaps' Planes.\n");
  315. #endif
  316.             MyCleanup();
  317.             Exit(-1);
  318.          }
  319.          BltClear(MyBitMaps[j].Planes[i], (RBMWIDTH / 8) * RBMHEIGHT, 1);
  320.       }
  321.    }
  322.    MyBitMapPtrs[0] = &MyBitMaps[0];
  323.    MyBitMapPtrs[1] = &MyBitMaps[1];
  324.    ns.CustomBitMap = MyBitMapPtrs[0]; /* !! */
  325.    screen->RastPort.Flags = DBUFFER;
  326.  
  327.  
  328.    if ((screen = (struct Screen *)OpenScreen(&ns)) == 0) {
  329. #ifdef DEBUG
  330.       kprintf("Main: Can't open Screen.\n");
  331. #endif
  332.       MyCleanup();
  333.       Exit(-1);
  334.    }
  335.  
  336.    SetRGB4(&screen->ViewPort, 00, 00, 00, 00);
  337.    SetRGB4(&screen->ViewPort, 01, 15, 00, 00);
  338.    SetRGB4(&screen->ViewPort, 02, 00, 15, 00);
  339.    SetRGB4(&screen->ViewPort, 03, 00, 00, 15);
  340.    SetRGB4(&screen->ViewPort, 04, 15, 15, 00);
  341.    SetRGB4(&screen->ViewPort, 05, 15, 00, 15);
  342.    SetRGB4(&screen->ViewPort, 06, 08, 15, 15);
  343.    SetRGB4(&screen->ViewPort, 07, 15, 11, 00);
  344.    SetRGB4(&screen->ViewPort, 08, 05, 13, 00);
  345.    SetRGB4(&screen->ViewPort, 09, 14, 03, 00);
  346.    SetRGB4(&screen->ViewPort, 10, 15, 02, 14);
  347.    SetRGB4(&screen->ViewPort, 11, 15, 13, 11);
  348.    SetRGB4(&screen->ViewPort, 12, 12, 09, 08);
  349.    SetRGB4(&screen->ViewPort, 13, 11, 11, 11);
  350.    SetRGB4(&screen->ViewPort, 14, 07, 13, 15);
  351.    SetRGB4(&screen->ViewPort, 15, 15, 15, 15);
  352.  
  353.    nw.Screen = screen;
  354. /*
  355.    if ((window = (struct Window *)OpenWindow(&nw)) == 0) {
  356. #ifdef DEBUG
  357.       kprintf("Main: Can't open Window.\n");
  358. #endif
  359.       MyCleanup();
  360.       Exit(-1);
  361.    }
  362. */
  363.  
  364.    if (ReadyGels(&GInfo, &screen->RastPort) != 0) {
  365. #ifdef DEBUG
  366.       kprintf("Main: ReadyGels failed.\n");
  367. #endif
  368.       MyCleanup();
  369.       Exit(-1);
  370.    }
  371.  
  372.    SetCollision(0, borderPatrol, &GInfo);
  373.  
  374.    if (InitImages() != TRUE) {
  375. #ifdef DEBUG
  376.       kprintf("Main: InitImages() failed.\n");
  377. #endif
  378.       MyCleanup();
  379.       Exit(-1);
  380.    }
  381.  
  382.    for(i = 0; i < NSPRITES; i++) {
  383.       if ((VSprites[i] = (struct VSprite *)MakeVSprite(VSPRITEHEIGHT,
  384.             VSpriteImage_chip, &MyVSpriteColors, i*6, (i*8)+10,
  385.             VSPRITEWIDTH,  VSPRITEDEPTH, VSPRITE)) == 0) {
  386. #ifdef DEBUG
  387.          kprintf("Main: MakeVSprite failed.\n");
  388. #endif
  389.          MyCleanup();
  390.          Exit(-1);
  391.       }
  392.  
  393.       VSprites[i]->VUserExt.vx = 1;
  394.       VSprites[i]->VUserExt.vy = 1;
  395.       VSprites[i]->VUserExt.id = i;
  396.  
  397.       AddVSprite(VSprites[i], &screen->RastPort);
  398.    }
  399.  
  400.    for(i = 0; i < NBOBS; i++) {
  401.       if ((Bobs[i] = (struct Bob *)MakeBob(BOBWIDTH, BOBHEIGHT, BOBDEPTH,
  402.             BobImage_chip, 0x0F, 0x00, (i*6), (i*8)+10,
  403.             SAVEBACK | OVERLAY)) == 0) {
  404. #ifdef DEBUG
  405.          kprintf("Main: MakeBob failed.\n");
  406. #endif
  407.          MyCleanup();
  408.          Exit(-1);
  409.       }
  410.  
  411.       Bobs[i]->BobVSprite->VUserExt.vx = 1;
  412.       Bobs[i]->BobVSprite->VUserExt.vy = 1;
  413.       Bobs[i]->BobVSprite->VUserExt.id = i;
  414.  
  415.       /* DBL BUF */
  416.       if ((Bobs[i]->DBuffer = (struct DBufPacket *)AllocMem (sizeof(struct
  417.             DBufPacket), MEMF_CHIP)) == 0) {
  418. #ifdef DEBUG
  419.          kprintf("Main: Can't allocate double buffers' packet for a bob.\n");
  420. #endif
  421.          MyCleanup();
  422.          Exit(-1);
  423.       }
  424.       if ((Bobs[i]->DBuffer->BufBuffer = (WORD *)AllocMem (sizeof(SHORT) *
  425.             BOBWIDTH * BOBHEIGHT * BOBDEPTH, MEMF_CHIP)) == 0) {
  426. #ifdef DEBUG
  427.          kprintf("Main: Can't allocate double buffer for a bob.\n");
  428. #endif
  429.          MyCleanup();
  430.          Exit(-1);
  431.       }
  432.  
  433.       AddBob(Bobs[i], &screen->RastPort);
  434.  
  435.    }
  436.  
  437.    SortBob();
  438.  
  439.    for (;;) {
  440.       DrawGels();
  441.  
  442.       while (MyIntuiMessage = (struct IntuiMessage *)
  443.             GetMsg(window->UserPort))
  444.          switch (MyIntuiMessage->Class) {
  445.             case CLOSEWINDOW:
  446.                ReplyMsg(MyIntuiMessage);
  447.                MyCleanup();
  448.                Exit(TRUE);
  449.                break;
  450.             default:
  451.                ReplyMsg(MyIntuiMessage);
  452.                break;
  453.          }
  454.    }
  455.  
  456. DrawGels()
  457. {
  458.    register struct VSprite *pSprite;
  459.  
  460.    pSprite = GInfo.gelHead->NextVSprite;
  461.    while (pSprite != GInfo.gelTail){
  462.       pSprite->X += pSprite->VUserExt.vx;
  463.       pSprite->Y += pSprite->VUserExt.vy;
  464.  
  465.       pSprite = pSprite->NextVSprite;
  466.    }
  467.  
  468.    SortGList(&screen->RastPort);
  469.    DoCollision(&screen->RastPort);
  470.    DrawGList(&screen->RastPort,&screen->ViewPort);
  471.    screen->ViewPort.RasInfo->BitMap = MyBitMapPtrs[ToggleFrame]; /* DBL BUF */
  472.    WaitTOF();
  473.    MakeScreen(screen);
  474.    RethinkDisplay();
  475.    ToggleFrame ^=1; /* DBL BUF */
  476.    screen->RastPort.BitMap = MyBitMapPtrs[ToggleFrame]; /* DBL BUF */
  477.  }
  478.  
  479. SortBob()
  480. {
  481.    register struct Bob *pBob, *pNext;
  482.    char NotExit;
  483.  
  484.    NotExit = -1;
  485.    while (NotExit) {
  486.       NotExit = 0;
  487.       pBob = GInfo.gelHead->NextVSprite->VSBob;
  488.       pNext = pBob->After;
  489.       while (pNext) {
  490.          if (pBob->BobVSprite->VUserExt.id > pNext->BobVSprite->VUserExt.id) {
  491.             NotExit = -1;
  492.             if (pBob->Before)
  493.                pBob->Before->After = pNext;
  494.             if (pNext->After)
  495.                pNext->After->Before = pBob;
  496.             pNext->Before = pBob->Before;
  497.             pBob->Before = pNext;
  498.             pBob->After =pNext->After;
  499.             pNext->After = pBob;
  500.          }
  501.          pNext = pBob->After;
  502.       }
  503.    }
  504. }
  505.  
  506. MyCleanup()
  507. {
  508.    short i;
  509.  
  510.    for (i=0; i < NBOBS; i++) {
  511.       if (Bobs[i] != NULL)
  512.          DeleteGel(Bobs[i]->BobVSprite);
  513.    }
  514.  
  515.    for (i=0; i < NSPRITES; i++) {
  516.       if (VSprites[i] != NULL)
  517.          DeleteGel(VSprites[i]);
  518.    }
  519.    PurgeGels(&GInfo);
  520.    FreeImages();
  521.    if (window != NULL)
  522.       CloseWindow(window);
  523.    if (screen != NULL)
  524.       CloseScreen(screen);
  525.    if (GfxBase != NULL)
  526.       CloseLibrary(GfxBase);
  527.    if (IntuitionBase != NULL)
  528.       CloseLibrary(IntuitionBase);
  529. }
  530.  
  531. InitImages()
  532. {
  533.    extern USHORT *VSpriteImage_chip;
  534.    extern USHORT *BobImage_chip;
  535.    int i;
  536.  
  537.    if ((VSpriteImage_chip = (USHORT *)
  538.          AllocMem(sizeof(VSpriteImage), MEMF_CHIP)) == 0) {
  539. #ifdef DEBUG
  540.       kprintf("InitImages: No Memory for VSpriteImage.\n");
  541. #endif
  542.       return(FALSE);
  543.    }
  544.    if ((BobImage_chip = (USHORT *)
  545.          AllocMem(sizeof(BobImage), MEMF_CHIP)) == 0) {
  546. #ifdef DEBUG
  547.       kprintf("InitImages: No Memory for BobImage.\n");
  548. #endif
  549.       return(FALSE);
  550.    }
  551.    for(i=0; i<24; i++)
  552.       VSpriteImage_chip[i] = VSpriteImage[i];
  553.    for(i=0; i<496; i++)
  554.       BobImage_chip[i] = BobImage[i];
  555.    return(TRUE);
  556. }
  557.  
  558. FreeImages()
  559. {
  560.    extern USHORT *VSpriteImage_chip;
  561.    extern USHORT *BobImage_chip;
  562.  
  563.    if (VSpriteImage_chip != 0)
  564.          FreeMem(VSpriteImage_chip, sizeof(VSpriteImage));
  565.    if (BobImage_chip != 0)
  566.          FreeMem(BobImage_chip, sizeof(BobImage));
  567. }
  568.